#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x=0;bool f=0;char ch=getchar();
	while(ch<'0'||ch>'9')f^=(ch=='-'),ch=getchar();
	while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
const int Maxn=5e5+5;
int n,k,d;
int a[Maxn],T[Maxn];
int f[Maxn];
struct Tree{int data,tag;}t[Maxn<<2];
inline void spread(int x){
	t[x<<1].tag=max(t[x<<1].tag,t[x].tag);
	t[x<<1|1].tag=max(t[x<<1|1].tag,t[x].tag);
	t[x<<1|1].data=max(t[x<<1|1].data,t[x].tag);
	t[x<<1].data=max(t[x<<1].data,t[x].tag);
	t[x].tag=0;
}
void build(int x,int l,int r){
	t[x].data=(int)-1e18;
	if(l==r)return;
	int mid=l+r>>1;
	build(x<<1,l,mid);build(x<<1|1,mid+1,r);
}
void change(int x,int l,int r,int L,int R,int p){
	if(L<=l&&r<=R){
		t[x].data=max(t[x].data,p);
		t[x].tag=max(t[x].tag,p);
		return;
	}int mid=l+r>>1;spread(x);
	if(mid>=L)change(x<<1,l,mid,L,R,p);
	if(mid<R)change(x<<1|1,mid+1,r,L,R,p);
	t[x].data=max(t[x<<1].data,t[x<<1|1].data);
}
int query(int x,int l,int r,int d){
	if(l==r)return t[x].data;
	int mid=l+r>>1;spread(x);
	if(mid>=d)return query(x<<1,l,mid,d);
	return query(x<<1|1,mid+1,r,d);
}
namespace sub1{
	inline void solve(){
		memset(f,-0x7f,sizeof f);
		f[1]=0;
		for(int i=1;i<=n;i++){
			f[i]+=a[i];
			for(int j=i+1;j<=i+T[i];j++)
				f[j]=max(f[j],f[i]-(j-i)/k*d);
		}
		printf("%lld\n",f[n]);
	}
}
signed main(){
	freopen("holiday.in","r",stdin);
	freopen("holiday.out","w",stdout);
	n=read();k=read();d=read();
	build(1,1,n);
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<n;i++)T[i]=read();
	if(n<=5000)sub1::solve(),exit(0);
	memset(f,-0x7f,sizeof f);
	for(int i=1;i<=n;i++){
		if(i==1)f[i]=a[i];
		else f[i]=max(f[i],a[i]+query(1,1,n,i)-((i+k-1)/k)*d);
		if(i<n)change(1,1,n,i+1,i+T[i],f[i]+((i+k-1)/k)*d);
		for(int i=1;i<=n;i++){
			f[i]+=a[i];
			for(int j=i+1;j<=i+min(T[i],60ll);j++)
				f[j]=max(f[j],a[j]+f[i]-(j-i)/k*d);
		}
	}printf("%lld\n",f[n]);
	return 0;
}
/*
13 2 2
-5 -4 -4 -1 7 -6 -5 -4 -3 -2 -1 5 -7
 3 10 9 8 7 6 5 4 3 2 1 1
*/
